import pkg from './package.json';
import moment from 'moment';
import { loadEnv } from 'vite';
import { resolve } from 'path';
import { wrapperEnv } from './build/utils';
import { createVitePlugins } from './build/vite/plugin';
import { OUTPUT_DIR } from './build/constant';

function pathResolve(dir) {
  return resolve(process.cwd(), '.', dir);
}

const { dependencies, devDependencies, name, version } = pkg;
const __APP_INFO__ = {
  pkg: { dependencies, devDependencies, name, version },
  lastBuildTime: moment().format('YYYY-MM-DD HH:mm:ss'),
};

export default ({ command, mode }) => {
  const root = process.cwd();

  const env = loadEnv(mode, root);

  // The boolean type read by loadEnv is a string. This function can be converted to boolean type
  const viteEnv = wrapperEnv(env);

  const { VITE_PORT, VITE_PUBLIC_PATH } = viteEnv;

  const isBuild = command === 'build';

  return {
    base: VITE_PUBLIC_PATH,
    root,
    resolve: {
      // 忽略后缀名的配置选项, 添加 .vue 选项时要记得原本默认忽略的选项也要手动写入
      extensions: ['.js', '.jsx', '.json', '.vue'],
      // 添加别名
      alias: [
        {
          find: 'vue-i18n',
          replacement: 'vue-i18n/dist/vue-i18n.cjs.js',
        },
        // @/xxxx => src/xxxx
        {
          find: /@\//,
          replacement: pathResolve('src') + '/',
        },
      ],
    },
    server: {
      // Listening on all local IPs
      host: true,
      port: VITE_PORT,
      proxy: {
        '/api': {
          target: 'http://192.168.43.132:6036',
          rewrite: (path) => path.replace(/^\/api/, ''),
          changeOrigin: true,
        },
        '/localFile': {
          target: 'http://192.168.43.132:8800',
          // rewrite: (path) => path.replace(/^\/api/, ''),
          changeOrigin: true,
        },
      },
    },
    build: {
      target: 'es2015',
      outDir: OUTPUT_DIR,
      //   terserOptions: {
      //     compress: {
      //       keep_infinity: true,
      //       // Used to delete console in production environment
      //       drop_console: VITE_DROP_CONSOLE,
      //     },
      //   },
      // Turning off brotliSize display can slightly reduce packaging time
      brotliSize: false,
      chunkSizeWarningLimit: 2000,
      commonjsOptions: {
        transformMixedEsModules: true,
      },
    },
    define: {
      // setting vue-i18-next
      // Suppress warning
      __INTLIFY_PROD_DEVTOOLS__: false,
      __APP_INFO__: JSON.stringify(__APP_INFO__),
      __SERVER_ADDRESS__: JSON.stringify('127.0.0.1:6036'),
    },

    // css: {
    //   preprocessorOptions: {
    //     scss: {
    //       modifyVars: generateModifyVars(),
    //       javascriptEnabled: true,
    //     },
    //   },
    // },

    // The vite plugin used by the project. The quantity is large, so it is separately extracted and managed
    plugins: createVitePlugins(viteEnv, isBuild),
    optimizeDeps: {
      //   exclude: ['./src/components/bydFilterBar/pinyin.js'],
      include: ['@/components/bydFilterBar/pinyin.js'],
    },
  };
};
